package org.lestr.secuel.sogl.maths;

import org.lestr.secuel.m3ds.IUsine;
import org.lestr.secuel.m3ds.maths.IPoint2d;
import org.lestr.secuel.m3ds.maths.IVecteur2d;

public class Vecteur2d extends Point2d implements IVecteur2d {


    // Déclaration de constantes
    private static final long serialVersionUID = 1L;


    /** Constructeur */
    public Vecteur2d(IUsine usine) {

        // Appel du constucteur hérité
        super(usine);

    }// FIN Constructeur


    /** Constructeur */
    public Vecteur2d(IUsine usine,
                     IPoint2d point2d) {

        // Appel du constucteur hérité
        super(usine, point2d);

    }// FIN Constructeur


    /** Constructeur */
    public Vecteur2d(IUsine usine,
                     double x,
                     double y) {

        // Appel du constucteur hérité
        super(usine, x, y);

    }// FIN Constructeur


    /** Retourne le norme du vecteur */
    @Override
    public double obtenirNorme() {

        return Math.sqrt(obtenirNormeAuCarré());

    }// FIN obtenirNorme


    /** Retourne le norme au carré du vecteur */
    @Override
    public double obtenirNormeAuCarré() {

        return obtenirX() * obtenirX() + obtenirY() * obtenirY();

    }// FIN obtenirNorme


    /** Normalise le vecteur */
    @Override
    public void normaliser() {

        double norm = 1.0 / obtenirNorme();

        définirXY(obtenirX() * norm,
                  obtenirY() * norm);

    }// FIN normaliser


    /** Retourne le produit vectoriel effectué entre le vecteur et un autre. */
    @Override
    public double produitVectoriel(IVecteur2d u) {

        return (obtenirX() * u.obtenirX() + obtenirY() * u.obtenirY());

    }// FIN produitVectoriel


    /** Retourne l'angle en degré effectué entre le vecteur et celui passé en paramètre. */
    @Override
    public double obtenirAngle(IVecteur2d u) {

        double x = produitVectoriel(u) / (obtenirNorme() * u.obtenirNorme());

        if (x < -1.0)
            x = -1.0;

        if (x > 1.0)
            x = 1.0;

        return Math.toDegrees(((double) (Math.acos(x))));

    }// FIN obtenirAngle


}// FIN Classe
